local function MakeParticles(data)
    local assets =
    {
        Asset("IMAGE", data.image),
        Asset("SHADER", data.needsharder),
    }


    local function fn()
        local inst = CreateEntity()
        
        inst.entity:AddTransform()
        inst.entity:AddNetwork()
        
        inst.entity:SetPristine()
        inst.persists = false


        if data.InitEnvelope ~= nil then
            data.InitEnvelope()
        end

        
        -- 服务器端不需要生成本地粒子特效
        if TheNet:IsDedicated() then
            return inst
        end
        -- 添加VFX特效组件
        local effect = inst.entity:AddVFXEffect()
        local number = data.number or 1
        effect:InitEmitters(number)  -- 初始化发射器数量
        for i = 0,number-1 do  --挨个配置每个粒子发射器
            effect:SetRenderResources(i, data.image, data.needsharder)    -- 设置贴图和着色器

            if data.UVframesize then
                effect:SetUVFrameSize(i, data.UVframesize.u_size, data.UVframesize.v_size)
            end

            if data.mode then
                effect:SetBlendMode(i, data.mode)
            end

            if data.maxparticlenumber then
                effect:SetMaxNumParticles(i, data.maxparticlenumber) -- 最大粒子数
            end

            if data.maxlifetime then
                effect:SetMaxLifetime(i, data.maxlifetime)           -- 粒子最长存活时间
            end

            if data.colour_envelope_name then
                effect:SetColourEnvelope(i, data.colour_envelope_name) -- 颜色变化曲线
            end

            if data.scale_envelope_name then
                effect:SetScaleEnvelope(i, data.scale_envelope_name)  -- 大小变化曲线
            end

            if data.rotation then
                effect:SetRotationStatus(i, data.rotation)
            end

            if data.ground then
                effect:SetGroundPhysics(i, data.ground) 
            end

            if data.acceleration then
                effect:SetAcceleration(i, data.acceleration.x, data.acceleration.y, data.acceleration.z)  -- 重力加速度
            end

            if data.dragcoefficient then
                effect:SetDragCoefficient(i, data.dragcoefficient) 
            end

            if data.order then
                effect:SetSortOrder(i, data.order)
            end

            if data.offset then
                effect:SetSortOffset(i, data.offset)
            end

            if data.depthtest then
                effect:EnableDepthTest(i, data.depthtest)
            end

            if data.bloom then
                effect:EnableBloomPass(i, data.bloom)
            end

            if data.radius then
                effect:SetRadius(i, data.radius) 
            end

            if data.killonentitydeath then
                effect:SetKillOnEntityDeath(i, data.killonentitydeath) 
            end

            if data.follow then
                effect:SetFollowEmitter(i, data.follow )
            end

            --以上粒子全部配置完毕
            --以下是将粒子注册到游戏中的更新系统
            inst.last_pos = inst:GetPosition()--粒子位置用到的地方比较多，因此统一到批量创建函数里来了
            inst.percentage = 1 --dyc粒子用到的比较多，也统一创建算了QAQ
            EmitterManager:AddEmitter(inst, data.emitterlifetime, data.updatafn(inst, effect, i))


            --以下是dyc粒子的专属配置部分，用于动态控制整个粒子特效的大小，达到一种淡出的效果
            if data.setPercentageFn then
                inst.SetPercentage = function(self, i,percentage)
                    percentage = percentage or 1
                    percentage = round(percentage * 100.0) / 100.0
                    percentage = math.max(0, math.min(percentage, 999))
                    self.percentage = percentage
                    data.setPercentageFn(self, i,percentage)
                end
            end
        end
            
        return inst
    end

    return Prefab(data.name, fn, assets)
end

local prefs = {}
local particles  = require("main/TS_DATA").particles--改成你自己的特效文件
for k, v in pairs(particles) do
    table.insert(prefs, MakeParticles(v))
end

return unpack(prefs)